package cn.tedu.oop2;
/**本类用作多态的入门案例*/
public class TestDemo {
    public static void main(String[] args) {
        Animal a = new Animal();
        Cat c = new Cat();
        Dog d = new Dog();
        a.eat();
        c.eat();
        d.eat();
        /**2.父类对象，不可以使用子类的特有功能*/
//        a.jump();//报错，Animal类里没有这个方法
        c.jump();
        d.run();
        /**3.口诀1:父类引用指向子类对象
         * 解释:创建出来的子类对象的地址值，交给父类类型的引用类型变量来保存*/
        Animal a2 = new Cat();
        Animal a3 = new Dog();
        /**4.口诀2.编译看左边，运行看右边
         * 解释:
         * 必须要在父类中定义这个方法，才能通过编译，因为多态对象认为自己是父类类型
         * 必须要在子类重写父类提供的方法，才能满足多态，因为实际干活的是子类*/
        a2.eat();
        a3.eat();
//        a2.jump();
    }
}
/**1.多态的前提:继承+重写*/
class Animal{
    public void eat(){
        System.out.println("小动物Animal吃啥都行~");
    }
}
class Cat extends Animal{
    @Override
    public void eat(){
        System.out.println("小猫爱吃小鱼干~");
    }
    public void jump(){
        System.out.println("小猫跳的老高了");
    }

}
class Dog extends Animal{
    @Override
    public void eat(){
        System.out.println("小狗爱吃小骨头~");
    }
    public void run(){
        System.out.println("小狗跑的老快了~");
    }
}